package com.gtw.bridge;

/**
 * 将抽象和实现解耦,使得两者可以独立变化,抽象角色引用实现角色,抽象角色的部分实现是由实现角色完成的
 * 完全是为了解决继承的缺点而提出的,实现完全不受抽象的约束
 * 优点:
 *      1.优秀的扩充能力,使得抽象和实现可以沿着各自的维度来变化,在两个变化维度中任意扩展一个维度，都不需要修改原有系统
 *      2.实现细节对客户透明，可以对用户隐藏实现细节,它已经由抽象层通过聚合关系完成了封装
 * 使用场景:
 *      1.一个类存在两个独立变化的维度，且这两个维度都需要进行扩展
 *      2.对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统
 *      3.虽然在系统中使用继承是没有问题的，但是由于抽象化角色和具体化角色需要独立变化，设计要求需要独立管理这两者
 * 注意事项:
 *      桥梁模式的意图还是对变化的封装,尽量把可能变化的因素封装到最小逻辑单元,发现类的继承有N层时,考虑使用此模式
 */

/**
 * 抽象化角色
 */
public abstract class Abstraction {
    /**
     * 需要一个实现化角色的引用
     */
    private Implementor implementor;

    public Abstraction(Implementor implementor) {
        this.implementor = implementor;
    }

    //自身行为
    public void request(){
        this.implementor.doSomething();
    }

    public Implementor getImplementor(){
        return this.implementor;
    }
}
